
// affiche la liste des questions dans l'élément voulu
// paramètres :
// - id_select : l'id de l'élément html SELECT où ajouter les questions
// - questions : le tableau de questions
// - articles : le tableau des articles
// - statuts : le tableau des statuts
// - id_out_reponse : id de l'élément HTML où afficher la suite des réponses
// - id_etape_2 : id de l'élément HTML contenant le formulaire pour choisir quelle est la question à affectée
// - id_select_etape_2 : id de l'élément html SELECT de l'étape 2 avec la liste des questions
// - id_action : id de l'élément HTML où afficher la liste des actions possibles
// - id_recapitulatif : id de l'élément HTML où afficher le récapitulatif final, avant l'envoi de la requête
// - id_liste_regle : id de l'élément HTML où afficher la liste des règles
function afficherQuestions(id_etape_1, id_select, questions, articles, statuts, id_out_reponse, id_etape_2, id_select_etape_2, id_action, id_recapitulatif, id_liste_regle) {
	// option de l'élément select
	var form_question = document.getElementById(id_etape_1);
	var select = document.getElementById(id_select);
	var out = document.getElementById(id_out_reponse);
	var form_question_affectee = document.getElementById(id_etape_2);
	var select_question_affectee = document.getElementById(id_select_etape_2);
	var action = document.getElementById(id_action);
	var recapitulatif = document.getElementById(id_recapitulatif);
	ajouterFonctionsComplementaires(select);
	ajouterFonctionsComplementaires(out);
	ajouterFonctionsComplementaires(action);
	ajouterFonctionsComplementaires(select_question_affectee);
	ajouterFonctionsComplementaires(recapitulatif);
	
	select.clearChilds();
	
	// affichage du formulaire de l'étape 1
	form_question.style.display = 'block';
	
	select.appendChild(nouvelElement('option'));
	// parcours des questions
	for (key in questions) {
		// ajout du libelle pour l'affichage dans le récapitulatif final
		questions[key].libelle = questions[key].info.libelle_question;
		// ajouts des options pour chaque questions dans le select
		select.appendChild(nouvelElement('option', {value:questions[key].info.id_question, text:questions[key].info.libelle_question, donnee:questions[key]}));
	}
	
	select.onchange = function () {
		action.clearChilds();
		recapitulatif.clearChilds();
		// obtention de l'élément selectionné
		var opt = select.options[select.selectedIndex];
		
		out.clearChilds();
		form_question_affectee.style.display = 'none';
		
		// si c'est bien une question
		if(opt.value) {
			// si c'est une question de type OUINON
			if(opt.donnee.info.type_reponse == 'OUINON') {
				// création des radios oui et non
				var oui = nouvelElement('input', {type:'radio', name:'ouinon'});
				var non = nouvelElement('input', {type:'radio', name:'ouinon'});
				
				//création des éléments de réponses possibles
				var elOui = new Object(), elNon = new Object();
				elOui.libelle = function () {return 'oui';};
				elOui.type = 'OUINON';
				elOui.reponse = 'oui';
				elOui.id_question = opt.donnee.info.id_question;
				elNon.libelle = function () {return 'non';};
				elNon.type = 'OUINON';
				elNon.reponse = 'non';
				elNon.id_question = opt.donnee.info.id_question;
				
				// ajout de l'affichage
				out.appendChilds([nouvelElement('span', {textnode:'Agir en fonction de la réponse :'}), nouvelElement('br'), nouvelElement('span', {textnode:'oui'}), oui, nouvelElement('span', {textnode:'non'}), non]);
				
				// ajout des actions lors du clic sur un radio
				oui.onclick = function () {afficherQuestionAffectee(opt.donnee, form_question_affectee, select_question_affectee, questions, statuts, action, recapitulatif, elOui, opt.value);};
				
				non.onclick = function () {afficherQuestionAffectee(opt.donnee, form_question_affectee, select_question_affectee, questions, statuts, action, recapitulatif, elNon, opt.value);};
			}
			// si c'est une question de type LISTE
			if(opt.donnee.info.type_reponse == 'LISTE') {
				out.appendChilds([nouvelElement('span', {textnode:'Agir en fonction de la réponse :'}), nouvelElement('br')]);
				// affichage de toutes les réponses et de leurs radiobox
				opt.donnee.checks = new Array();
				var listeReponse = new Array();
				for (key in opt.donnee.reponses) {
					var rep = opt.donnee.reponses[key];
					var el = nouvelElement('input', {type:'checkbox', name:'liste', value:opt.donnee.reponses[key].libelle_reponse_combo});
					rep.htmlElement = el;
					opt.donnee.checks.push(el);
					out.appendChilds([nouvelElement('span', {textnode:opt.donnee.reponses[key].libelle_reponse_combo}), el, nouvelElement('br')]);
					
					listeReponse.push(rep);
				}
				var reponse = new Object();
				reponse.type = 'LISTE';
				reponse.id_question = opt.donnee.info.id_question;
				reponse.all = listeReponse;
				reponse.libelle = function () {
					var premier = true;
					var libelle = '';
					for (k in listeReponse) {
						if(listeReponse[k].htmlElement.checked) {
							if(premier) premier = false; else libelle += ' ou ';
							libelle += listeReponse[k].htmlElement.value;
						}
					}
					return libelle;
				};
				afficherQuestionAffectee(opt.donnee, form_question_affectee, select_question_affectee, questions, statuts, action, recapitulatif, reponse, opt.value);
				
			}
			// si c'est une question de type ENTIER
			if(opt.donnee.info.type_reponse == 'ENTIER') {
				
				// affichage de la question
				out.appendChilds([nouvelElement('span', {textnode:"Spécifier l'intervalle sur lequel réagir :"}), nouvelElement('br')]);
				// création de l'input Min et Max
				var inputMin = nouvelElement('input', {type:'number'});
				var inputMax = nouvelElement('input', {type:'number'});
				// affichage de l'entrée Min
				out.appendChilds([nouvelElement('span', {textnode:"Valeur min : "}), inputMin, nouvelElement('br')]);
				// affichage de l'entrée Max
				out.appendChilds([nouvelElement('span', {textnode:"Valeur max : "}), inputMax, nouvelElement('br')]);
				// ajout du bouton de validation de l'intervalle
				var inputValiderIntervalle = nouvelElement('input', {type:'button', value:'Valider'});
				out.appendChild(inputValiderIntervalle);
				var erreur = nouvelElement('span', {textnode:"", className:'error-message'});
				erreur.style.display = "none";
				out.appendChild(erreur);
				// ajout de l'action sur le clic du bouton
				inputValiderIntervalle.onclick = function () {
					if(parseFloat(inputMin.value) > parseFloat(inputMax.value)) {
						erreur.changerTexte("La valeur minimum doit être inférieure à la valeur maximale.");
						erreur.style.display = "block";
					}
					else {
						erreur.changerTexte("");
						erreur.style.display = "none";
						// création de la réponse
						var reponse = new Object();
						reponse.type = 'ENTIER';
						reponse.id_question = opt.donnee.info.id_question;
						reponse.valMin = inputMin.value;
						reponse.valMax = inputMax.value;
						reponse.libelle = function () {return 'de ' + inputMin.value + ' à ' + inputMax.value;};
						afficherQuestionAffectee(opt.donnee, form_question_affectee, select_question_affectee, questions, statuts, action, recapitulatif, reponse, opt.value);
					}
				};
			}
			// si c'est une question de type ARTICLE
			if(opt.donnee.info.type_reponse == 'ARTICLE') {
				// affichage de la question
				out.appendChilds([nouvelElement('span', {textnode:"Choisissez l'article parmi la liste : "}), nouvelElement('br')]);
				// création du select sur les articles
				var selectArticle = nouvelElement('select', {childs:[nouvelElement('option')]});
				// ajout des options du select
				for (key in articles) {
					// si c'est la bonne categorie
					if(key == opt.donnee.info.id_categorie) {
						// on ajoute les articles de cette categorie au select
						for (keyArt in articles[key].articles) {
							selectArticle.appendChild(nouvelElement('option', {value:articles[key].articles[keyArt].id_article, text:articles[key].articles[keyArt].ref_article}));
						}
					}
				}
				// ajout de l'action au changement du select
				selectArticle.onchange = function () {
					// si ce n'est pas l'élément vide
					if(selectArticle.options[selectArticle.selectedIndex].value) {
						// création de la réponse
						var reponse = new Object();
						reponse.type = 'ARTICLE';
						reponse.id_question = opt.donnee.info.id_question;
						reponse.id_article = selectArticle.options[selectArticle.selectedIndex].value;
						reponse.libelle = function () {return selectArticle.options[selectArticle.selectedIndex].text;};
						// on affiche la question avec la réponse à créer
						afficherQuestionAffectee(opt.donnee, form_question_affectee, select_question_affectee, questions, statuts, action, recapitulatif, reponse, opt.value);
					}
				}
				// ajout du select à l'affichage
				out.appendChild(selectArticle);
			}
		}
	}
}



// affiche la deuxième étape permettant de choisir quelle est la question a affecter
// paramètres :
// - question_choisie : la question sur la quelle doit porter la règle
// - question : la question d'où provient la réponse
// - form : le formulaire à afficher
// - select : l'élément html SELECT où on choisit la question affecté
// - questions : la liste des questions
// - statuts : la liste des statuts
// - action : l'élément HTML où afficher les actions possibles
// - recapitulatif : l'élément HTML où afficher la formule finale et le bouton de validation
// - reponse : la réponse lié à cet événement (reponse.libelle doit exister pour l'affichage)
function afficherQuestionAffectee(question, form, select, questions, statuts, action, recapitulatif, reponse, question_choisie) {
	// on affiche le formulaire
	form.style.display = 'block';
	
	action.clearChilds();
	recapitulatif.clearChilds();
	// on ajoute un élément vide après avoir vidé
	select.clearChilds();
	select.appendChild(nouvelElement('option', {value:undefined, text:''}));
	// parcours des questions
	for (key in questions) {
		select.appendChild(nouvelElement('option', {value:questions[key].info.id_question, text:questions[key].info.libelle_question, donnee:questions[key]}));
	}
	
	// lorsqu'on choisi une question, on affiche les actions possibles
	select.onchange = function () {
		var question_affecte = select.options[select.selectedIndex].donnee.info;
		
		if (question_affecte.id_question == question_choisie) {
			alert('Vous ne pouvez pas enregistrer une règle portant 2 fois sur la même question.');
			$(select).find("option:first").attr("selected", "selected");
			
			action.clearChilds();
			recapitulatif.clearChilds();
		}
		else{
			action.clearChilds();
			recapitulatif.clearChilds();
			
			// ajout des boutons activé et desactivé
			var active = nouvelElement('input', {type:'button', value:'Activer'});
			var desactive = nouvelElement('input', {type:'button', value:'Desactiver'});

			// ajout des actions des boutons
			active.onclick = function () {
				// création du bouton de validation qui envoie la requête au serveur
				var valider = nouvelElement('input', {type:'button', value:'Valider'});
				valider.onclick = function () {enregistrerRegle(reponse, question_affecte, 'active');}
				// ajout des infos et du bouton dans le récapitulatif
				recapitulatif.clearChilds();
				recapitulatif.appendChilds([
					nouvelElement('span', {textnode:"Si l'utilisateur répond '"+reponse.libelle()+"' à la question '"+question.libelle+"', alors la question '"+question_affecte.libelle_question+"' est activée."}),
					valider
				]);
			};
		}
		
		desactive.onclick = function () {
			// création du bouton de validation qui envoie la requête au serveur
			var valider = nouvelElement('input', {type:'button', value:'Validé'});
			valider.onclick = function () {enregistrerRegle(reponse, question_affecte, 'desactive');}
			// ajout des infos et du bouton dans le récapitulatif
			recapitulatif.clearChilds();
			recapitulatif.appendChilds([
				nouvelElement('span', {textnode:"Si l'utilisateur repond '"+reponse.libelle()+"' à la question '"+question.libelle+"', alors la question '"+question_affecte.libelle_question+"' est désactivée."}),
				valider
			]);
		};
		
		// ajout des boutons à l'élément action
		action.appendChilds([nouvelElement('span', {textnode:'Action à effectuer : '}), active, desactive]);
	}
}

// Retourne le libellé de la question de l'id passé en paramètre
function trouverLibelleQuestion(id_question) {
	var ma_question;
	for(var k in questions){
		if(questions[k].info.id_question == id_question) {
			ma_question = questions[k].info;
			//alert(questions[k].info.libelle_question);
		}
	}
	return ma_question.libelle_question;
}

// Retourne le champ description_article de l'article passé en paramètre
function trouverDescriptionArticle(id_article) {
	var mon_article;
	for(var a in articles) {
		for(var k in articles[a].articles) {
		if(articles[a].articles[k].id_article == id_article) 
			mon_article = articles[a].articles[id_article];
		}
	}
	return mon_article.description_article;
}

// permet d'ajouter une regle entre une réponse et une question à la base de données
// paramètres :
// - reponse : la réponse, si elle n'a pas d'id, on crée d'abord la réponse dans la bdd à partir de plusieurs élément (reponse.id_question, reponse.type, [reponse.valMin], [reponse.valMax], [article], [oui])
// - question : la question qui est affectée par la réponse
// - action : le type de l'action à appliquer (active, desactive, changerstatut, ajoute, retire)
// - nouveauStatut : l'id du nouveau statut si celui-ci est changé
function enregistrerRegle(reponse, question, action, nouveauStatut) {
	
	var question_gauche;
	var reponse_gauche_texte;
	if(reponse.type == 'LISTE') {
		for (k in reponse.all) {
			if(reponse.all[k].htmlElement.checked) {
				if(reponse.all[k].id_reponse == undefined) {
					var result = sendQueryJSON('ajouterReponse', 'question='+reponse.all[k].id_question+'&type=liste&reponse='+reponse.all[k].id_reponse);
					reponse.all[k].id_reponse = result.id_reponse;
				}
				reponse_gauche_texte = reponse.all[k].libelle_reponse_combo;
				if(sendQueryJSON('ajouterRegle', 'id_reponse='+reponse.all[k].id_reponse+'&id_question='+question.id_question+'&action='+action+(nouveauStatut ? '&statut='+nouveauStatut : ''), 'POST').success) {
					alert('La règle à été ajoutée avec succès.');
					
					question_gauche = trouverLibelleQuestion(reponse.id_question);
					$("#zeroreglesactive").remove();
					$("#tableau_active_desactive > tbody").append("<tr><td>"+
						question_gauche+"</td><td>"+
						reponse_gauche_texte+"</td><td>"+
						action+"</td><td>"+
						trouverLibelleQuestion(question.id_question)+
						"</td><td>"+
						"<img onclick=\"var q = sendQuery('supprimerRegle', 'id_reponse="+reponse.id_reponse+"&id_question="+question.id_question+ "', 'POST');"+
									"if(q == '') this.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode);"+
									"\" class=\"curs_pointer\" src=\"../../img/delete.png\"/>"
						+"</td></tr>");
			
				}
			}
		}
	}
	else {
		if(reponse.id_reponse == undefined) {
			var result;
			if(reponse.type == 'OUINON') {
				result = sendQueryJSON('ajouterReponse', 'question='+reponse.id_question+'&type=ouinon&reponse='+reponse.reponse, 'POST');
				reponse_gauche_texte = reponse.reponse;
			}
			else if(reponse.type == 'ENTIER') {
				result = sendQueryJSON('ajouterReponse', 'question='+reponse.id_question+'&type=entier&min='+reponse.valMin+'&max='+reponse.valMax, 'POST');
				reponse_gauche_texte = "une valeur comprise entre "+reponse.valMin +" et "+reponse.valMax;
			}
			else if(reponse.type == 'ARTICLE') {
				result = sendQueryJSON('ajouterReponse', 'question='+reponse.id_question+'&type=article&article=' + reponse.id_article);
				reponse_gauche_texte = trouverDescriptionArticle(reponse.id_article);
			}
			reponse.id_reponse = result.id_reponse;
		}

		if(sendQueryJSON('ajouterRegle', 'id_reponse='+reponse.id_reponse+'&id_question='+question.id_question+'&action='+action+(nouveauStatut ? '&statut='+nouveauStatut : ''), 'POST').success) {
			alert('La règle à été ajoutée avec succès.');
			
			
			question_gauche = trouverLibelleQuestion(reponse.id_question);
			$("#zeroreglesactive").remove();
			$("#tableau_active_desactive > tbody").append("<tr><td>"+
				question_gauche+"</td><td>"+
				reponse_gauche_texte+"</td><td>"+
				action+"</td><td>"+
				trouverLibelleQuestion(question.id_question)+
				"</td><td>"+
				"<img onclick=\"var q = sendQuery('supprimerRegle', 'id_reponse="+reponse.id_reponse+"&id_question="+question.id_question+ "', 'POST');"+
							"if(q == '') this.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode);"+
							"\" class=\"curs_pointer\" src=\"../../img/delete.png\"/>"
				+"</td></tr>");
			
		}
	}
}

// permet de construire le tableau de base pour la liste des règles
// paramètre :
// - liste_regle : élément HTML où ajouter le tableau des listes de règles
function construireTableauRegle(liste_regle) {
	var table = nouvelElement('table');
	var titre = nouvelElement('tr');
	titre.appendsChild(
	[
		nouvelElement('th', {textnode:'description'}),
		nouvelElement('th', {textnode:'Question'}),
		nouvelElement('th', {textnode:'Reponse'}),
		nouvelElement('th', {textnode:'Question affecte'}),
		nouvelElement('th', {textnode:'Action'})
	]);
	
}

